package com.shwread.android.qysw.activity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.ConsoleMessage;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.NewActionHelp;
import com.google.gson.reflect.TypeToken;
import com.shwread.android.qysw10000204.R;
import com.shwread.android.ui.customview.BadgeView;
import com.shwread.android.ui.widget.LoadingView;
import com.shwread.http.base.ObjectHttpResponseHandler;

import org.apache.http.Header;

import java.lang.reflect.Type;

import logic.bean.GoodsBaseInfo;
import logic.constants.DefaultConsts;
import logic.dao.ShoppingCartDao;
import logic.util.Utils;


/**
 * @author zhangnannan
 * @project qysw_e-commerce
 * @description banner列表页面
 * @Time 2015年4月9日 下午8:15:21
 */
public class bannerListActivity
        extends
        BaseBusinessActivity
        implements
        OnClickListener {
    private Context mContext;
    private TextView tvTitle;
    private Button btnBack;

    private WebView webView;
    private HarlanWebChromeClient chromeClient = null;

    private ImageView gotoShoppingCart;
    private GoodsBaseInfo goodsInfo;

    //加载动画
    private LoadingView loadingView;
    private String goodsUrl;
    private String goodsIds;
    private BadgeView badgeView;

    @Override
    public Handler getUIHandler() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.banner_list);
        mContext = this;
        initView();
        initData();
        getShoppingCartCount();
        //		initLoadingView();
        setListener();
        setWebView();
        if (savedInstanceState != null) {
            webView.restoreState(savedInstanceState);
        }
    }

    private void initView() {
        tvTitle = (TextView) findViewById(R.id.common_header_name);
        tvTitle.setVisibility(View.GONE);
        btnBack = (Button) findViewById(R.id.common_header_back);
        btnBack.setVisibility(View.VISIBLE);

        loadingView = (LoadingView) findViewById(R.id.banner_list_loading_view);
        webView = (WebView) findViewById(R.id.banner_list_wv);
        gotoShoppingCart = (ImageView) findViewById(R.id.banner_list_shopping_car_iv);

        badgeView = new BadgeView(mContext, gotoShoppingCart);
        badgeView.setTextSize(10);
        badgeView.setBadgePosition(2);// 2代表右上角
        badgeView.setBackgroundResource(R.drawable.red_radio);
        badgeView.setTextColor(mContext.getResources().getColor(android.R.color.white));
        badgeView.show();

    }

    private void initData() {
        if (getIntent() != null) {
            goodsUrl = getIntent().getExtras().getString(DefaultConsts.GOODS_BASE_URL_TO_WAP);
            goodsIds = getIntent().getExtras().getString(DefaultConsts.GOODS_ID_TO_WAP);
        }

//		NewActionHelp.qryGoodsBase(mContext, goodsId, new GoodsBaseHandker());

    }

    /**
     * 获取购物车信息
     */
    private void getShoppingCartCount() {
        ShoppingCartDao shoppingCartDao = ShoppingCartDao.getInstance(mContext);
        long count = shoppingCartDao.queryCount(NewActionHelp.getAccount());
        badgeView.setText(count <= 0 ? "" : String.valueOf(count));
    }

    private class GoodsBaseHandker
            extends
            ObjectHttpResponseHandler<GoodsBaseInfo> {

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
            if (statusCode < 1000) {

                Utils.ToastShow(mContext, "网络错误");
            } else {
                Utils.ToastShow(mContext, "请求出错");
            }

        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, GoodsBaseInfo object, String responseString) {
            System.out.println("xxxxxxxxxxxxxxxxxxx_" + responseString);
            goodsInfo = object;
        }

        @Override
        public Type getType() {
            return new TypeToken<GoodsBaseInfo>() {
            }.getType();
        }

    }

    private void setListener() {
        btnBack.setOnClickListener(this);
        gotoShoppingCart.setOnClickListener(this);
    }

    private void initLoadingView() {
        loadingView.setLoadingAnim(R.drawable.home_progress);
        loadingView.changeLoadingStatus(0);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        webView.saveState(outState);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.common_header_back:
                goback();
                break;

            case R.id.banner_list_shopping_car_iv:
                Intent intentCart = new Intent(bannerListActivity.this, ShoppingCartActivity.class);
                startActivity(intentCart);
                break;

            default:
                break;
        }

    }

    //	private void setViewAnimation() {
    //		ObjectAnimator oa=ObjectAnimator.ofFloat(getWindow().getAttributes(), "alpha", 0f, 1f);
    //		oa.setDuration(3000);
    //		oa.start();
    //    }

    void goback() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            setResult(RESULT_OK);
            finish();
        }
    }

    @Override
    public void onBackPressed() {
        goback();
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void setWebView() {
        /*
		 * webSettings 保存着WebView中的状态信息。
		 * 当WebView第一次被创建时，webSetting中存储的都为默认值。
		 * WebSetting和WebView一一绑定的。
		 * 如果webView被销毁了，那么我们再次调用webSetting中的方法时，会抛出异常。
		 */
        WebSettings webSettings = webView.getSettings();

        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        webView.setWebViewClient(new HarlanWebViewClient());

        chromeClient = new HarlanWebChromeClient();
        webView.setWebChromeClient(chromeClient);

        //		webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

        webView.setHorizontalScrollBarEnabled(false);
        webView.setVerticalScrollBarEnabled(false);

        webSettings.setSupportZoom(false);
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true); //适应屏幕

        if (Utils.isEmpty(goodsUrl)) {
            loadingView.setVisibility(View.GONE);
        } else {
            webView.loadUrl(Utils.addUrlTimestamp(goodsUrl));
        }
		
		/*
		 * 为js提供一个方法，注意该方法一般不写在UI线程中
		 * addJavascriptInterface(Object obj, String interfaceName)
		 * obj代表一个java对象，这里我们一般会实现一个自己的类，类里面提供我们要提供给javascript访问的方法
		 * interfaceName则是访问我们在obj中声明的方法时候所用到的js对象，调用方法为window.interfaceName.方法名(
		 * )
		 */
        webView.addJavascriptInterface(new SubMaintenanceJavaScriptInterface(), "qyreader");
    }

    final class SubMaintenanceJavaScriptInterface {

        /**
         * 在屏幕下端提示用户
         */
        public void setBookInfo(String bookId, String bookName, String bookType) {
        }

        /**
         * 提供给B端打印日志
         */
        public void fireLog(String log) {
        }

        /**
         * 假如有历史记录 回退历史记录 否则退出容器
         */
        public void goBack() {
            BaseBusinessActivity.uiHandler.post(new Runnable() {
                @Override
                public void run() {
                    onBackPressed();
                }
            });
        }
    }

    /***
     * webChromeClient主要是将javascript中相应的方法翻译成android本地方法
     * 例如：我们重写了onJsAlert方法，那么当页面中需要弹出alert窗口时，便
     * 会执行我们的代码，按照我们的Toast的形式提示用户。
     */
    class HarlanWebChromeClient
            extends
            WebChromeClient {

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
        }

        @Override
        public void onHideCustomView() {
        }

        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            // TODO Auto-generated method stub
            Log.d("ZR", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + consoleMessage.lineNumber());
            return super.onConsoleMessage(consoleMessage);
        }

        /*
         * 此处覆盖的是javascript中的alert方法。
         * 当网页需要弹出alert窗口时，会执行onJsAlert中的方法
         * 网页自身的alert方法不会被调用。
         */
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Utils.showToast(mContext, message);
			/*
			 * 此处代码非常重要，若没有，android就不能与js继续进行交互了，
			 * 且第一次交互后，webview不再展示出来。
			 * result：A JsResult to confirm that the user hit enter.
			 * 我的理解是，confirm代表着此次交互执行完毕。只有执行完毕了，才可以进行下一次交互。
			 */
            result.confirm();
            return true;
        }

        /*
         * 此处覆盖的是javascript中的confirm方法。
         * 当网页需要弹出confirm窗口时，会执行onJsConfirm中的方法
         * 网页自身的confirm方法不会被调用。
         */
        @Override
        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
            return true;
        }

        /*
         * 此处覆盖的是javascript中的confirm方法。
         * 当网页需要弹出confirm窗口时，会执行onJsConfirm中的方法
         * 网页自身的confirm方法不会被调用。
         */
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            return true;
        }

        /*
         * 如果页面被强制关闭,弹窗提示：是否确定离开？
         * 点击确定 保存数据离开，点击取消，停留在当前页面
         */
        @Override
        public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
            return true;
        }
    }

    class HarlanWebViewClient
            extends
            WebViewClient {
        @SuppressLint("NewApi")
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            WebResourceResponse response = null;
            response = super.shouldInterceptRequest(view, url);
            return response;
        }

        /*
         * 点击页面的某条链接进行跳转的话，会启动系统的默认浏览器进行加载，调出了我们本身的应用
         * 因此，要在shouldOverrideUrlLoading方法中
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            //使用当前的WebView加载页面
            if (url.contains("tel:")) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_DIAL);
                intent.setData(Uri.parse(url));
                startActivity(intent);
                return true;
            }
            view.loadUrl(url);
            return true;
        }

        /*
         * 网页加载完毕(仅指主页，不包括图片)
         */
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        /*
         * 网页加载完毕(仅指主页，不包括图片)
         */
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            loadingView.setVisibility(View.GONE);
        }

        /*
         * 加载页面资源
         */
        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
        }

        /*
         * 错误提示
         */
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            loadingView.setVisibility(View.GONE);
        }
    }

    ;

}
